package com.study.inoutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: FileOutputStreamTest
* @Description: 文件字节输出流测试类
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-15 下午2:01:34 
* @Version: V1.0
 */
public class FileOutputStreamTest {
	
	/**
	* @Name: fileOutputStream01
	* @Description: FileOutputStream类测试方法
	* 字节输出流操作步骤：
	* 	1、创建字节输出流对象；
	* 	2、写数据；
	* 	3、关闭字节输出流，释放资源；
	* 1、创建字节输出流对象
		     构造方法：
		  	public FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
		  	public FileOutputStream(File file, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
		  												如果第二个参数为 true，则将字节写入文件末尾处，而不是写入文件开始处。
		  	public FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
		  	public FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
														如果第二个参数为 true，则将字节写入文件末尾处，而不是写入文件开始处。
		     创建文件字节输出流对象，jvm所做的事情：
		  	1、判断指定路径的文件是否存在：
		  		不存在，则调用系统功能创建文件，然后走2；
		  		存在，走2；
		  	2、创建文件字节输出流对象；
		  	3、将该对象指向这个文件；
	  2、写数据
	  	public void write(int b)	将指定的字节写入此输出流。
		public void write(byte[] b) 将指定的字节数组写入此输出流。
		public void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
	  3、关闭字节输出流，释放资源
	  	public void close() 关闭此输出流并释放与此流有关的所有系统资源。close 的常规协定是：该方法将关闭输出流。关闭的流不能执行输出操作，也不能重新打开。 
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午2:03:00
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileOutputStream01() throws IOException {
		//1、创建文件读取字节流对象
//		FileOutputStream fos = new FileOutputStream(new File("file.txt")) ;
		FileOutputStream fos = new FileOutputStream("fos.txt") ;
		//2、写数据
//		fos.write(97) ; //写入一个字符：a
//		byte[] buf = {97, 98, 99, 100, 101} ;
//		fos.write(buf) ; //写入一个字符数组：abcde
//		fos.write(buf, 1, 3) ; //写入字符数组的一部分：bcd
		String data = "hello, io" ;
		fos.write(data.getBytes()) ; //写入一个字符串：hello, io；本质还是写入一个字符数组
		//3、释放资源
		fos.close();
	}
	
	/**
	* @Name: fileOutputStream02
	* @Description: FileOutputStream类测试方法：加入文件内容追加属性和换行符。
	* 操作：
		1、创建文件字节输出流对象时，指定文件内容追加属性
		2、每添加一条数据时，插入换行符
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午2:36:09
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileOutputStream02() throws IOException{
		//1、创建文件字节输出流对象，并指定文件追加属性
		FileOutputStream fos = new FileOutputStream("fos2.txt", true) ;
		//2、写数据
		for (int i = 0; i < 10; i++) {
			fos.write(("hello" + i).getBytes()) ;
			//添加换行符
			fos.write("\r\n".getBytes()) ;
		}
		//3、释放资源
		fos.close() ;
	}
	
	/**
	* @Name: fileOutputStream03
	* @Description: FileOutputStream类测试方法：加入异常处理
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午2:41:05
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileOutputStream03() {
		//声明文件字节输出流对象
		FileOutputStream fos = null ;
		try {
			//实例化文件字节输出流对象
			fos = new FileOutputStream("fos3.txt", true) ;
			//写数据
			for (int i = 0; i < 10; i++) {
				fos.write(("hello" + i).getBytes()) ;
				fos.write("\r\n".getBytes()) ;
			}
		} catch (FileNotFoundException e) { //捕获实例化文件字节输出流对象异常
			//异常处理
			e.printStackTrace() ; 
		} catch (IOException e) { //捕获文件字节输出流对象的写数据异常
			//异常处理
			e.printStackTrace() ;
		} finally {
			//释放资源
			if(fos != null) {
				try {
					fos.close() ;
				} catch (IOException e) { //捕获文件字节输出流对象释放资源异常
					//异常处理
					e.printStackTrace();
				}
			}
		}
	}

}
